package com.da.javatest.interview.session2;

import java.util.ArrayList;
import java.util.List;

/**
 * @author chenlida
 * @date 2020/4/5 23:01
 * 垃圾回收算法：引用计数，复制算法，标记清除，标记压缩整理
 *
 * 1.Serial：他为单线程环境设计且只是用一个线程进行垃圾回收，会暂停所有用户线程。所以不适合服务器环境。
 *
 * 2.Parallel：多个垃圾收集线程并行工作，此时用户线程是暂停的，适用于科学计算/大数据处理首台处理等弱交互场景。
 *
 * 3.CMS（Current Mark Sweep）用户线程和垃圾回收线程同时执行（不一定是并行，可交替执行），
 * 不需要停顿用户线程，互联网公司多用它，适用对响应时间有要求的场景。
 * 缺点：并发执行对CPU资源压力大，采用标记清除算法会导致大量内存碎片。可以开启参数设置多少次回收以后进行一次压缩
 *
 * 4.G1收集器 是当今收集器技术发展最前沿的成果，它是一款面向服务端应用的收集器，它能充分利用多CPU、多核环境。
 * 因此它是一款并行与并发收集器，并且它能建立可预测的停顿时间模型。
 *
 * 查看加载的初始参数：java -XX:+PrintCommandLineFlags -version
 * UseSerialGC UseParallelGC UseConcMarkSweepGC UseParNewGC UseParallelOldGC UseG1GC
 *
 * -Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC
 *
 * 参数整合微服务启动：公式：java -sever jvm各种参数 -jar 打包好的jar/war包名字
 * java -sever -Xms1024m -Xmx1024m -XX:+UseG1GC -jar xxx.war
 */
public class Test27GCAlgorithm {
    public static void main(String[] args) {
        System.out.println("********GC Test*********");
        try {
            List<byte[]> list = new ArrayList<>();
            while (true) {
                list.add(new byte[300 * 1024]);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
